package com.lmf.rabbitmq.three;

import com.lmf.rabbitmq.utils.RabbitMqUtils;
import com.rabbitmq.client.CancelCallback;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 这是一个工作线程：（相当于之前的一个消费者）
 *      默认是轮循的形式接受，生产者发出的消息
 */
public class Worker02 {

    private final static String TASK_QUEUE_NAME = "ack_queue";

    public static void main(String[] args) throws IOException, TimeoutException {

        Channel channel = RabbitMqUtils.getChannel();
        System.out.println("C1 等待接收消息处理时间较 短");

        //推送的消息如何进行消费的接口回调：手动应答消息
        DeliverCallback deliverCallback = (consumerTag, delivery) -> {
            String message = new String(delivery.getBody());
            try {
                Thread.sleep(1000);//线程睡一秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("接收到消息:" + message);
            /**
             * basicAck():手动应答消息
             *      1.消息标记 tag
             *      2.是否批量应答未应答消息,会将整个队列的所有消息全部自动应答
             */
            channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
        };

        //取消消费的一个回调接口 如在消费的时候队列被删除掉了
        CancelCallback cancelCallback = (consumerTag) -> {
            System.out.println("消息消费被中断");
        };
        /**
         * 设置不公平分发：提高消费者的效率;    prefetchCount = 1 表示不公平分发； prefetchCount = 0 表示公平分发，也是默认分发方式
         *      若 prefetchCount >= 2 ,则表示预取值
         */
//        int prefetchCount = 1;
        int prefetchCount = 2;
        channel.basicQos(prefetchCount);
        channel.basicConsume(TASK_QUEUE_NAME,false,deliverCallback,cancelCallback);
    }
}
